package sim_moteur.factory;

import java.util.HashMap;
import java.util.Map;

import sim_moteur.Simulateur.ChosesPossibles;
import sim_moteur.element.Chose;

public class SimFactory extends AbstractFactory {

	private static SimFactory instance;

	private SimFactory() {
		super();
	}

	/**
	 * Retourne la seule instance de fabrique d'animaux. (singleton) Noter que
	 * chaque thread possède sa propre copie du singleton
	 * 
	 * @return la fabrique
	 */
	public static SimFactory getInstance() {
		if (instance == null) {
			instance = new SimFactory();
		}
		return instance;
	}

	/**
	 * On reset toutes les factory du simulateur
	 */
	public static void reset() {
		instance = new SimFactory();
		AnimauxFactory.reset();
		ChoseFactory.reset();
		VegetauxFactory.reset();
	}

	@SuppressWarnings("rawtypes")
	public ChoseFactoryI getFactory(ChosesPossibles sorte) {
		ChoseFactoryI fabrique = null;
		switch (sorte) {
		case ANIMAL:
			fabrique = AnimauxFactory.getInstance();
			break;
		case VEGETAL:
			fabrique = VegetauxFactory.getInstance();
			break;
		case CHOSE:
			fabrique = ChoseFactory.getInstance();
			break;
		}
		return fabrique;
	}

	/**
	 * Avec le numéro de simulation, nous le mettons dans la méthode init pour
	 * que ce numéro se suivre tout au long de sa création
	 */
	public <T extends Chose> Map<String, T> getAll(ChosesPossibles filtre,
			int pNumeroSimulation) {

		@SuppressWarnings("unchecked")
		ChoseFactoryI<T> fabrique = getFactory(filtre);

		/* Ici, nous insérons le numéro de simulation */
		fabrique.init(pNumeroSimulation);

		HashMap<String, T> retMap = new HashMap<>();

		retMap.putAll(fabrique.getAll());

		return retMap;
	}
}
